package com.emmmya.ocs.modules.system.utils;

import com.emmmya.ocs.modules.system.entity.Dict;
import com.emmmya.ocs.modules.system.entity.Menu;
import com.emmmya.ocs.modules.system.entity.Permissions;
import com.emmmya.ocs.modules.system.entity.Role;
import com.emmmya.ocs.modules.system.service.MenuService;
import com.emmmya.ocs.modules.system.service.PermissionsService;
import com.emmmya.ocs.common.entity.LayUITree;
import com.emmmya.ocs.common.entity.LayUIXmSelect;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

/**
 * @description: 主要功能用于把系统的实体对象转成layui的tree结构数据
 * @author: 咕噜肉IT小店-黑医
 * @createDate: 2021-01-29
 * @version: 1.0
 */
@Component
public class LayuiTreeUtils {
    @Autowired
    MenuService menuService;

    @Autowired
    PermissionsService permissionsService;


    public List<LayUITree> changeDictTree(List<Dict> dicts, boolean spread, boolean checked) {
        List<LayUITree> layUITrees = new ArrayList<>();
        for(Dict m : dicts){
            LayUITree layUITree = new LayUITree();
            layUITree.setId(m.getId().intValue());
            layUITree.setTitle(m.getDictName());
            layUITree.setSpread(spread); //是否展开
            layUITree.setChecked(checked); //是否展开
            layUITree.setField(m.getDictType());
            //layUITree.setChecked(check);
            //List<Menu> menus = menuService.findByParentId(m.getId().intValue());
            //寻找子目录
            //layUITree.setChildren(changeTree(menus,false,check));
            layUITrees.add(layUITree);
        }
        return layUITrees;
    }

    public List<LayUITree> changePermissionTree(List<Permissions> permissionsList , boolean spread, boolean check){
        List<LayUITree> layUITrees = new ArrayList<>();
        for (Permissions p : permissionsList) {
            LayUITree layUITree = new LayUITree();
            layUITree.setId(p.getId().intValue());
            layUITree.setTitle(p.getPermissionName());
            layUITree.setSpread(spread); //是否展开
            layUITree.setChecked(check);
            layUITree.setLevel(p.getLevel());
            List<Permissions> childPermissions = permissionsService.findByParentId(p.getId());
            //寻找子目录
            layUITree.setChildren(changePermissionTree(childPermissions,false,check));
            layUITrees.add(layUITree);
        }
        return layUITrees;
    }

    public List<LayUITree> changePermissionTree(List<Permissions> permissionList,List<Permissions> rolePermissionList){
        List<LayUITree> layUITrees = new ArrayList<>();
        //角色中所有的菜单id
        List<Long> rolemPermissionIds = rolePermissionList.stream().map(Permissions::getId).collect(Collectors.toList());

        for(Permissions p : permissionList){
            LayUITree layUITree = new LayUITree();
            layUITree.setId(p.getId().intValue());
            layUITree.setTitle(p.getPermissionName());
            if(rolemPermissionIds.contains(p.getId())) {
                layUITree.setChecked(true);
            }
            List<Permissions> childrenPermissions = permissionsService.findByParentId(p.getId());
            if(!childrenPermissions.isEmpty()) {
                layUITree.setSpread(true); //是否展开
                //处理子目录
                layUITree.setChildren(changePermissionTree(childrenPermissions, rolePermissionList));
            }
            layUITrees.add(layUITree);
        }
        return layUITrees;
    }



    public List<LayUITree> changeTree(List<Menu> menu, boolean spread, boolean check) {
        List<LayUITree> layUITrees = new ArrayList<>();
        for(Menu m : menu){
            LayUITree layUITree = new LayUITree();
            layUITree.setId(m.getId().intValue());
            layUITree.setTitle(m.getMenuname());
            layUITree.setSpread(spread); //是否展开
            layUITree.setChecked(check);
            List<Menu> menus = menuService.findByParentId(m.getId().intValue());
            //寻找子目录
            layUITree.setChildren(changeTree(menus,false,check));
            layUITrees.add(layUITree);
        }
        return layUITrees;
    }

    /**
     * 处理所有的页面里面，是否有角色菜单的。有的话就勾选，展开
     * @param menus
     * @param roleMenu
     * @return
     */
    public List<LayUITree> changeTree(List<Menu> menus,List<Menu> roleMenu) {
        List<LayUITree> layUITrees = new ArrayList<>();
        //角色中所有的菜单id
        List<Long> rolemMenuIds = roleMenu.stream().map(Menu::getId).collect(Collectors.toList());

        for(Menu m : menus){
            LayUITree layUITree = new LayUITree();
            layUITree.setId(m.getId().intValue());
            layUITree.setTitle(m.getMenuname());
            if(rolemMenuIds.contains(m.getId())) {
                layUITree.setChecked(true);
            }
            List<Menu> childrenMenus = menuService.findByParentId(m.getId().intValue());
            if(!childrenMenus.isEmpty()) {
                layUITree.setSpread(true); //是否展开
                //处理子目录
                layUITree.setChildren(changeTree(childrenMenus, roleMenu));
            }
            layUITrees.add(layUITree);
        }
        return layUITrees;
    }

    public List<LayUIXmSelect> changeSelecte(List<Role> allRoles, List<Role> userRoles) {
        List<LayUIXmSelect> layUIXmSelects = new ArrayList<>();
        //1.把当前用户的所有角色id取出来
        List<Long> roleIds = userRoles.stream().map(Role::getId).collect(Collectors.toList());
        //2.遍历所有的角色，赋值名字和value，并做选中或禁用判断。
        for (Role role : allRoles) {
            LayUIXmSelect layUIXmSelect = new LayUIXmSelect();
            layUIXmSelect.setName(role.getRoleName());
            layUIXmSelect.setValue(role.getId());
            if(role.getDelFlag() != 0){
                layUIXmSelect.setDisabled(true);
            }
            if(roleIds.contains(role.getId())){
                layUIXmSelect.setSelected(true);
            }
            layUIXmSelects.add(layUIXmSelect);
        }
        return layUIXmSelects;

    }

//    public List<LayUITree> changeTree(List<Role> roles,List<Role> userRoles) {
//        List<LayUITree> layUITrees = new ArrayList<>();
//        for(Role r : roles){
//            LayUITree layUITree = new LayUITree();
//            layUITree.setId(r.getId().intValue());
//            layUITree.setTitle(r.getMenuname());
//            layUITree.setSpread(true); //是否展开
//            layUITree.setChecked(check);
//            List<Menu> menus = menuService.findByParentId(m.getId().intValue());
//            //寻找子目录
//            layUITree.setChildren(changeTree(menus,false,check));
//            layUITrees.add(layUITree);
//        }
//        return layUITrees;
//    }

}
